package iosu.java.games.razer;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

public class TrackInfoLoader {
    // la imagen que se muestra
    private BufferedImage trackart;
    // la plantilla con los datos del circuito
    private BufferedImage trackinfo;
    // la matriz con la info de la plantilla cargada
    protected int[][] tracktemplate;
    
    public TrackInfoLoader(BufferedImage ti, BufferedImage ta){
        this.trackinfo = ti;
        this.trackart = ta;
    }
    
    public void loadTrack(){
     // y ahora relleno el array
        // y meto los pixels en un array 800x480
    	boolean hasAlphaChannel = false;
    	byte[] pixels = new byte[4];
		pixels[0]=0;pixels[1]=0;pixels[2]=0;pixels[3]=0;
    	if(trackinfo!=null){
    		hasAlphaChannel = trackinfo.getAlphaRaster() != null;
    		tracktemplate = new int[trackinfo.getWidth()][trackinfo.getHeight()];
    		pixels = ((DataBufferByte)trackinfo.getRaster().getDataBuffer()).getData();
    	}else{
    		
    	}
    	loadTrackTemplate(hasAlphaChannel, pixels);
//        System.out.println("despues de loadtracktemplate");
    }
    
    private void loadTrackTemplate(boolean hasAlphaChannel, byte[] pixels){
        // en BLACK la pista
        // en GREEN la hierba
        // en RED donde no puedo entrar
        // en YELLOW las puertas
        // en BLUE la salida/llegada
        // ------------------------
        
          if (hasAlphaChannel) {
             final int pixelLength = 4;
             for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
                 // 4 bytes, ALPHA, BLUE, GREEN, RED
                // si el color del pixel es rojo puede ser: rojo o amarillo (rojo+verde)
                 if((pixels[pixel+3]&0xff)>200){
                    // si verde es cero -> es rojo
                     if((pixels[pixel+2]&0xff)<200){
                         tracktemplate[col][row] = Track.TRACK_RED;
                    // si verde no es cero, es amarillo
                     }else{
                         tracktemplate[col][row] = Track.TRACK_YELLOW;
                     }
                 }else{
                // si no es rojo, puede ser verde, azul o negro
                     if((pixels[pixel+2]&0xff)<200){
                    // si no es verde puede ser azul o negro
                        // si no es azul, es negro
                         if((pixels[pixel+1]&0xff)<200){
                             tracktemplate[col][row]=Track.TRACK_BLACK;
                         }else{
                        // si es azul
                             tracktemplate[col][row]=Track.TRACK_BLUE;
                         }
                     }else{
                    // si es verde
                         tracktemplate[col][row]=Track.TRACK_GREEN;
                     }
                 }
                col++;
                if (col == 800) {
                   col = 0;
                   row++;
                }
             }
          } else {
             final int pixelLength = 3;
             for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
                int argb = 0;
                argb += -16777216; // 255 alpha
                argb += ((int) pixels[pixel] & 0xff); // blue
                argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
                argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
                tracktemplate[col][row] = argb;
                col++;
                if (col == 800) {
                   col = 0;
                   row++;
                }
             }
          }

        
    
    }
    
    public BufferedImage getTrackart(){
        if(this.trackart!=null){
            return this.trackart;
        }else{
            throw new IllegalArgumentException("error en la carga de la pista");
        }
    }

}
